package come.bjpowernode.javase.io;

import java.io.*;

/*
拷贝目录。
 */
public class CopyDirectory {
    public static void main(String[] args) {
        //拷贝源
        File srcFile = new File("F:\\postgraduate\\研究生\\2020建模");
        //拷贝目标
        File destFile = new File("F:\\postgraduate\\研究生\\2020建模_复制");
        //调用方法拷贝
        copyDir(srcFile,destFile);
    }

    /**
     * 拷贝目录
     * @param srcFile 拷贝源
     * @param destFile 拷贝目标
     */
    private static void copyDir(File srcFile, File destFile) {

        if (srcFile.isFile()){
            //srcFile如果是一个文件的话递归结束
            //同时完成文件的拷贝
            //一边读一遍写
            FileInputStream in = null;
            FileOutputStream out = null;
            try {
                //读这个文件
                //源目录：F:\postgraduate\研究生\2020建模\9.17正式建模
                in = new FileInputStream(srcFile);
                //写到这个文件中
                //目标目录：F:\postgraduate\研究生\2020建模_复制\9.17正式建模
                String path = (destFile.getAbsolutePath().
                        endsWith("\\") ?
                        destFile.getAbsolutePath()
                        :destFile.getAbsolutePath() + "\\") +
                        srcFile.getAbsolutePath().substring(27);
                System.out.println(path);
                //out在写向文件写东西的时候，如果文件不存在，会自动创建
                out = new FileOutputStream(path);

                byte[] bytes = new byte[1024 * 1024];//一次复制1M
                int readCount = 0;
                while((readCount = in.read(bytes)) != -1){
                    out.write(bytes,0,readCount);
                }
                out.flush();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(in != null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(out != null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }
        //获取拷贝源下的子目录
        File[] files = srcFile.listFiles();
        /*//代码不要一直写，要测试
        System.out.println(files.length);*/
        for(File file : files){
            //获取所有的目录和文件的绝对路径
            //System.out.println(file.getAbsolutePath());
            //这个file可能是文件也可能是目录
            if(file.isDirectory()){
                //新建对应的目录
                //System.out.println(file.getAbsolutePath());
                //源目录：F:\postgraduate\研究生\2020建模\9.17正式建模
                //目标目录：F:\postgraduate\研究生\2020建模_复制\9.17正式建模
                String srcDir = file.getAbsolutePath();
                String destDir = (destFile.getAbsolutePath().
                        endsWith("\\") ? destFile.
                        getAbsolutePath()  :destFile.
                        getAbsolutePath() + "\\") +
                        srcDir.substring(27);
                File newFile = new File(destDir);
                if(! newFile.isDirectory()){
                    newFile.mkdirs();
                }

            }
            //递归调用
            copyDir(file,destFile);
        }
    }

}
